package com.sky.mapper;

import com.github.pagehelper.Page;
import com.sky.annotation.AutoFill;
import com.sky.dto.EmployeePageQueryDTO;
import com.sky.entity.Employee;
import com.sky.enumeration.OperationType;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface EmployeeMapper {

    /**
     * 根据用户名查询员工
     *
     * @param username
     * @return
     */
    @Select("select * from employee where username = #{username}")
    Employee getByUsername(String username);

    /**
     * 新增员工
     *
     * @param employee
     */
    @Insert("insert into employee (name, username, password, phone, sex, id_number, status, create_time, update_time, create_user, update_user)" +
            " values (#{name}, #{username}, #{password}, #{phone}, #{sex}, #{idNumber}, #{status}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser})")
    @AutoFill(value = OperationType.INSERT)
    void insert(Employee employee);

    /**
     * 根据员工分页查询条件，查询员工信息的分页结果。
     *
     * @param employeePageQueryDTO 员工分页查询条件的数据传输对象，包含分页信息和查询条件。
     * @return 返回员工的分页查询结果，包含查询到的员工列表和分页信息。
     */
    Page<Employee> pageQuery(EmployeePageQueryDTO employeePageQueryDTO);


    /**
     * 使用Builder模式更新Employee对象。
     * 此方法接收一个EmployeeBuilder实例，通过该实例的设置，更新现有的Employee对象。
     * Builder模式被用于逐步构建复杂的Employee对象，这种方式允许在不改变现有对象的基础上，动态地更新其属性。
     *
     * @param builder EmployeeBuilder实例，包含了用于更新Employee对象的属性值。
     */
    @AutoFill(value = OperationType.UPDATE)
    void update(Employee builder);

    /**
     * 根据员工id查询员工信息
     *
     * @param id
     * @return
     */
    @Select("select * from employee where id = #{id}")
    Employee getById(Long id);

}
